/*
 * Copyright 2020 ThoughtWorks, Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
import {ApiRequestBuilder, ApiResult, ApiVersion} from "helpers/api_request_builder";
import {SparkRoutes} from "helpers/spark_routes";
import {MaintenanceModeInfo, MaintenanceModeInfoJSON} from "models/maintenance_mode/types";

export class MaintenanceModeAPIs {
  private static API_VERSION_HEADER = ApiVersion.v1;
  private static CONFIRM_HEADER     = {"X-GoCD-Confirm": "true"};

  static enable() {
    return ApiRequestBuilder.POST(SparkRoutes.enableMaintenanceModePath(),
                                  MaintenanceModeAPIs.API_VERSION_HEADER,
                                  {headers: MaintenanceModeAPIs.CONFIRM_HEADER});
  }

  static disable() {
    return ApiRequestBuilder.POST(SparkRoutes.disableMaintenanceModePath(),
                                  MaintenanceModeAPIs.API_VERSION_HEADER,
                                  {headers: MaintenanceModeAPIs.CONFIRM_HEADER});
  }

  static info() {
    return ApiRequestBuilder.GET(SparkRoutes.maintenanceModeInfoPath(), MaintenanceModeAPIs.API_VERSION_HEADER)
                            .then(MaintenanceModeAPIs.extractInfoObject());
  }

  private static extractInfoObject() {
    return (result: ApiResult<string>): ApiResult<MaintenanceModeInfo> => {
      return result.map<MaintenanceModeInfo>((body) => {
        return MaintenanceModeInfo.fromJSON(JSON.parse(body) as MaintenanceModeInfoJSON);
      });
    };
  }
}
